package com.cn.genericity.wildcard;

/**
 * @author hels
 * @version 1.0
 * @date 2022/12/13 17:15
 * 通配符中：
 * < ? extends ceiling> 规定了类型的上界，各种子类实例可以获取的，
 *      但是无法写入，使用时会指定该泛型具体的类，因此各个子类之间无法转换不能写入，
 *      但是取值可以用ceiling类型（父类）变量进行赋值获取。
 *
 * < ? super floor> 规定了类型的下界floor，因此可以直接将floor的子类实例进行插入，
 *      向上转型可以直接转。但是无法获取，无法确定取值出来的是floor的哪种父类。
 */
class Food {
}
interface Frr{}

class Fruit extends Food implements Frr {
}

class Apple extends Fruit {
}

class Orange extends Fruit {
}

class Plate<T> {
    public T plate;

    public T getPlate() {
        return plate;
    }

    public void setPlate(T plate) {
        this.plate = plate;
    }
}

public class Test02 {
    public static void main(String[] args) {
        Plate<Apple> applePlate = new Plate<>();
        applePlate.setPlate(new Apple());
        func(applePlate);

        Plate<Fruit> fruitPlate = new Plate<>();
        fruitPlate.setPlate(new Fruit());
        func2(fruitPlate);
    }

    public static void func(Plate<? extends Food> temp) {
        //  可以获取数据，但是不能写入数据
        Food fd = temp.getPlate();
        System.out.println(temp.getPlate());
        System.out.println("fd:" + fd);
    }

    public static void func2(Plate<? super Fruit> temp) {
        // 不能获取数据，可以写入数据
        /*Food fd = temp.getPlate();*/
        temp.setPlate(new Orange());
        System.out.println(temp.getPlate());
//        System.out.println("fd:" + fd);
    }
}


